//Map
///Map是一组键值对的结构，有极快的查找速度
////用Map只需要一个名字和成绩的对照表，直接根据名字查找成绩
var a =new Map([['A',50],['B',69],['C',82]])
console.log(a.get('A'));   //50，输出A的成绩50
console.log(a);   //["A" => 50, "B" => 69, "C" => 82]，包括名字和成绩
////Map具有以下方法
a.set('D',95)   //增加一组D的成绩为95
console.log(a);   //["A" => 50, "B" => 69, "C" => 82, "D" => 95]
a.delete('D')   //删除D
console.log(a.get('D'));    //undefined,查找已经被删除的对象，不会报错
console.log(a.has('D'));  //false ,是否有D的数据，输出true或false

console.log(a.keys());   //A,B,C  输出全部名字
for(var item of a.keys())
{
    console.log(item);
}                            //for循环将名字一一排列


console.log(a.values());  //输出全部成绩
console.log(a.entries());  //输出全部内容


var m = new Map();
m.set('Adam', 67);
m.set('Adam', 88);
console.log(m.get('Adam'));    //一个key只能对应一个value,所以后面的key会把前面的key冲掉，输出88

m.forEach((key,val,self)=>{
    console.log(key);
    console.log(val);
    console.log(self);
}

)

//////Set
var s=new Set([1,2,3,3,3,'3','3'])
console.log(s);   //因为Set过滤掉重复值，所以输出(1，2，3，'3')
s.add(4)       //增加一个元素4
console.log(s);   //输出（1，2，3，'3',4）
s.add(4)     //因为之前增加过4，所以重复增加无效果
console.log(s);   //输出（1，2，3，'3',4）
s.delete(2)   
console.log(s);  //  [1, 3, "3", 4]删除一个元素
for(var aa of s.keys())
{
    console.log(aa);
}        //一一排序


s.forEach((key,val,self)=>{
    console.log(key);
    console.log(val);
    console.log(self);
}

)



//iterable
////Map、Set无法使用下标，Array、Map、Set都属于iterable类型
////具有iterable类型的集合都可以用for...of循环来遍历
var a3=['A','B','C']
var b3=new Set(['a','b','c'])
var c3=new Map([[1, 'x'],[2, 'y'],[3, 'z']]);
for (var x of a3) {
    console.log(x);    //A,B,C
}
for (var x of b3) {
    console.log(x);    //a,b,c
}
for (var x of c3) {
    console.log(x[0]+'='+x[1]);   //1=x,2=y,3=z
}


//与for...in有什么区别，for...in实际上是遍历属性，Array的索引其实被视为一个属性，当手动添加一个属性时，for...in效果如下
var aa=['a','b','c']
aa.name='ljy'
for (var x in aa) {
    console.log(x);   //[0,1,2,name]    for in循环索引属性
}
for (var s of aa) {
    console.log(s);   //a,b,c   for of循环本身元素
}


var a = ['A', 'B', 'C'];
a.forEach(function (element, index, array) {   //回调函数
    // element: 指向当前元素的值
    // index: 指向当前索引
    // array: 指向Array对象本身
    console.log(element + ', index = ' + index);  //A, index = 0  B, index = 1  C, index = 2
    console.log(array);   //["A", "B", "C"]
});
//Set因为没有索引，所以回调函数前两个返回的是元素本身
var bb=new Set(['a','b','c'])
bb.forEach(function(x,y,z){
    //console.log(x);  //a b c
    //console.log(y);  //a b c
    console.log(z);   //['a','b','c']
});
//Map的回调函数函数依次为value，key，map本身
var s=new Map([[1,'x'],[2,'y'],[3,'z']])
s.forEach(function (value,key,map) {
    //console.log(value);   //x  y  z
    //console.log(key);    //1  2  3
    console.log(map);    //{1 => "x", 2 => "y", 3 => "z"}
});